/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2007，所有权利保留。
 * 
 * 项目名：	rumba
 * 文件名：	HETextArea.java
 * 模块说明：	
 * 修改历史：
 * Aug 29, 2007 - lxm - 创建。
 */
package com.hd123.rumba.jsp.table;

import java.util.ArrayList;
import java.util.List;

import com.hd123.rumba.exception.BusinessException;

/**
 * 基于&lt;textarea&gt;的表格单元编辑器
 * 
 * @author lxm
 * 
 */
public abstract class HETextArea extends HEditor {

  /**
   * 构造函数。
   * 
   * @param params
   *          其它参数数组。可用的参数说明参见相应的属性说明。
   */
  public HETextArea(Object[] params) {
    super(params);
    this.buttons = new ArrayList<HButton>();
  }

  private String validCharJS;
  private String invalidCharJS;
  private String validStringJS;

  private List<HButton> buttons;

  /**
   * 无效输入字符的正则表达式。null表示不进行有效字符的检查。应保持与{@link #validCharJS}保持互补。<br>
   * 对应参数名"invalidCharJS"，下一个参数为取值，类型为String。<br>
   * 
   * <br>
   * 取值内容为符合javascript中正则表达式的语法规则。
   */
  public String getInvalidCharJS() {
    return invalidCharJS;
  }

  public void setInvalidCharJS(String invalidCharJS) {
    this.invalidCharJS = invalidCharJS;
  }

  /**
   * 有效输入字符的正则表达式。null表示不进行有效字符的检查。应保持与{@link #invalidCharJS}保持互补。<br>
   * 对应参数名"validCharJS"，下一个参数为取值，类型为String。<br>
   * 
   * <br>
   * 取值内容为符合javascript中正则表达式的语法规则。
   */
  public String getValidCharJS() {
    return validCharJS;
  }

  public void setValidCharJS(String validCharJS) {
    this.validCharJS = validCharJS;
  }

  /**
   * 合法字符串的正则表达式。null表示不进行字符串合法性检查。<br>
   * 对应参数名"validStringJS"，下一个参数为取值，类型为String。<br>
   * 
   * <br>
   * 取值内容为符合javascript中正则表达式的语法规则。
   */
  public String getValidStringJS() {
    return validStringJS;
  }

  public void setValidStringJS(String validStringJS) {
    this.validStringJS = validStringJS;
  }

  /** 属性：按钮列表。 */
  public List<HButton> getButtons() {
    return buttons;
  }

  /**
   * 清除所有的按钮。
   * 
   */
  public void clearButtons() {
    if (this.buttons == null)
      this.buttons = new ArrayList<HButton>();
    else
      this.buttons.clear();
  }

  /**
   * 添加一个按钮。
   * 
   * @param button
   *          指定被添加的按钮。
   * @return 返回表示按钮显示顺序的索引。
   * @throws BusinessException
   */
  public int appendButton(HButton button) throws BusinessException {
    if (button == null)
      throw new BusinessException("指定的参数button不可为null。");
    int idx = this.buttons.indexOf(button);
    if (idx >= 0) return idx;
    this.buttons.add(button);
    return this.buttons.indexOf(button);
  }

  @Override
  protected boolean readParam(String paramName, Object paramValue) {
    if ("validCharJS".equals(paramName)) {
      this.validCharJS = (String) paramValue;
      return true;
    }
    if ("invalidCharJS".equals(paramName)) {
      this.invalidCharJS = (String) paramValue;
      return true;
    }
    if ("validStringJS".equals(paramName)) {
      this.validStringJS = (String) paramValue;
      return true;
    }
    return false;
  }
  
  @Override
  public String toJS() {
    StringBuffer sb = new StringBuffer();
    sb.append(super.toJS());
    
    for (HButton button : this.buttons) {
      sb.append("editor.appendButton(");
      sb.append(button.getClassNameJS());
      sb.append(", {");
      sb.append(button.buildConfigJS());
      sb.append("});\n");
    }
    
    return sb.toString();
  }

  @Override
  protected String buildConfigJS() {
    StringBuffer sb = new StringBuffer();
    if (this.validCharJS != null)
      sb.append("validChar: " + this.validCharJS);
    if (this.invalidCharJS != null) {
      if (sb.length() > 0)
        sb.append(", ");
      sb.append("invalidChar: " + this.invalidCharJS);
    }
    if (this.validStringJS != null) {
      if (sb.length() > 0)
        sb.append(", ");
      sb.append("validString: " + this.validStringJS);
    }
    return sb.toString();
  }

}
